package com.algernoon.nettydemo.aio.server;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class AcceptCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsyncTimeServerHandler> {

	/**
	 * 从AsyncTimeServerHandler获取成员变量AsynchronousServerSocketChannel，继续调用它的accept方法，调用原因：
	 * 
	 * 当我们调用AsynchronousServerSocketChannel的accept方法后，如果有新的客户端连接接入，系统将回调我们传入的CompletionHandler
	 * 实例的completed方法，表示新的客户端已经接入成功，因为一个AsynchronousServerSocketChannel可以接收成千上万个客户端，所以我们需要
	 * 继续调用它的accept方法，接收其它的客户端连接，最终形成一个循环。每当接收一个异步的客户读连接成功后，再异步接收新的客户端连接。
	 * 
	 */
	@Override
	public void completed(AsynchronousSocketChannel result, AsyncTimeServerHandler attachment) {
		attachment.asynchronousServerSocketChannel.accept(attachment, this);
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		// 异步读操作
		// 参数一： 接收缓存区，用于从异步Channel中读取数据包
		// 参数二：异步Channel携带的附件，通知回调的时候作为入参使用
		// 参数三：接收通知回调的业务handler
		result.read(buffer, buffer, new ReadCompletionHandler(result));
	}

	@Override
	public void failed(Throwable exc, AsyncTimeServerHandler attachment) {
		attachment.latch.countDown();
	}

}
